# 自定义索引转换器，供整个项目使用，所以单开一个文件
# 记得去info的init里面flask添加一下
import functools

from flask import session, current_app, g

from info.models import User


def func_index_convert(index):
    index_dict = {1: "first", 2: "second", 3: "third"}
    return index_dict.get(index, "")


# 因为判断是否登录，和得到用户模型对象，很多视图函数都需要使用。所以需要抽取出来
# 可以用函数封装，也可以用装饰器
# 先写一个闭包函数
def user_login_data(f):
    # 因为内部调用的时候显示的函数名为路由+wrapper，当同一个路由不同视图函数需要被装饰时，内部调用的函数名都是一样的，容易出错，
    # 所以需要使用@functools.wraps来将内部调用显示的函数名为路由+视图函数，所有其他功能及调用都和之前一样，但是避免了出错
    # 给闭包加上这个装饰器以后, 就可以在获取闭包函数信息时, 不显示闭包函数信息, 而是显示原函数信息
    @functools.wraps(f)
    def wrapper(*args, **kwargs):
        # 用session取出的user_id判断用户是否登录
        user_id = session.get("user_id")
        user = None  # type: User
        # 根据user_id从数据库取出user模型对象,要进行异常捕捉
        if user_id:
            try:
                user = User.query.get(user_id)
            except BaseException as e:
                current_app.logger.error(e)
        # 将user存进上下文管理器g中，以后只要被装饰了就可以取到g里的user模型对象
        g.user = user
        # 将视图函数返回
        return f(*args, **kwargs)

    return wrapper
